/*
    Asignatura: Procesadores de lenguajes.
    Practica de labotario numero 8.
    Autores:
                Guillermo Garcia Juanes (Alu3889)
                Jose Antonio Hernandez Gonzalez (Alu3809)

    Fichero: AnasinSimple.g
    Contenido: Resolucion del ejercio primero y segundo de la practica.
*/
parser grammar AnasinSimple;

options {
    tokenVocab = AnalexSimple;
    backtrack=true;
}

@members{
    Hashtable variables = new Hashtable();
}

@header {
    package pl.equipo13.p8;
    import java.util.Hashtable;
}

/*----------------------------------------------------SINTACTICO----------------------------------------------------*/

entrada: (instruccion)* EOF;
instruccion: expresion | asignacion;
asignacion: i=IDENT OPASIGNACION e=expr SEPARADOR { variables.put(i.getText(), new Integer(e)); 
                                                    System.out.println("Asignacion (" + i.getText() + ") => " + e);};

                                                    catch [ArithmeticException ae] {
                                                                                    System.out.println("Error en la asignacion");
                                                                                    input.consume();
                                                                                    System.out.println("Asignacion (" + i.getText() + ") => " + (Integer)variables.get(i.getText()));
                                                                                   }
                                                                
expresion: e=expr SEPARADOR {System.out.println("Expresion => " + e);};
expr returns [int res=0]: e1=exp_mult {res=e1;} ((SUMA e2=exp_mult {res=res+e2;}) | (RESTA e2=exp_mult {res=res-e2;}))*;
exp_mult returns [int res=0]: e1=exp_base {res=e1;} ((MULTIPLICACION e2=exp_base {res=res*e2;}) | (DIVISION e2=exp_base {res=res/e2;}))*; catch [ArithmeticException ae] {System.out.println("Error! No intentes dividir por 0"); throw(ae);}
exp_base returns [int res=0]: (n=NUMERO {res = new Integer(n.getText()).intValue();}
                               | id=IDENT { Integer idn = (Integer)variables.get(id.getText());
                                            if (idn != null)
                                                res = idn;
                                            else
                                                res = 0;} )
                                    | APARENTESIS e=expr {res = e;} CPARENTESIS;